home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / Alacarte / util.py < prev   
Text File  |  2009-10-05  |  8KB  |  245 lines

  1. # -*- coding: utf-8 -*-
  2. #   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
  3. #   Copyright (C) 2006  Travis Watkins
  4. #
  5. #   This library is free software; you can redistribute it and/or
  6. #   modify it under the terms of the GNU Library General Public
  7. #   License as published by the Free Software Foundation; either
  8. #   version 2 of the License, or (at your option) any later version.
  9. #
  10. #   This library is distributed in the hope that it will be useful,
  11. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. #   Library General Public License for more details.
  14. #
  15. #   You should have received a copy of the GNU Library General Public
  16. #   License along with this library; if not, write to the Free Software
  17. #   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19. import os
  20. import gtk, gmenu
  21. from ConfigParser import ConfigParser
  22.  
  23. class DesktopParser(ConfigParser):
  24.     def __init__(self, filename=None, file_type='Application'):
  25.         ConfigParser.__init__(self)
  26.         self.filename = filename
  27.         self.file_type = file_type
  28.         if filename:
  29.             if len(self.read(filename)) == 0:
  30.                 #file doesn't exist
  31.                 self.add_section('Desktop Entry')
  32.         else:
  33.             self.add_section('Desktop Entry')
  34.         self._list_separator = ';'
  35.  
  36.     def optionxform(self, option):
  37.         #makes keys not be lowercase
  38.         return option
  39.  
  40.     def get(self, option, locale=None):
  41.         locale_option = option + '[%s]' % locale
  42.         try:
  43.             value = ConfigParser.get(self, 'Desktop Entry', locale_option)
  44.         except:
  45.             try:
  46.                 value = ConfigParser.get(self, 'Desktop Entry', option)
  47.             except:
  48.                 return None
  49.         if self._list_separator in value:
  50.             value = value.split(self._list_separator)
  51.         if value == 'true':
  52.             value = True
  53.         if value == 'false':
  54.             value = False
  55.         return value
  56.  
  57.     def set(self, option, value, locale=None):
  58.         if locale:
  59.             option = option + '[%s]' % locale
  60.         if value == True:
  61.             value = 'true'
  62.         if value == False:
  63.             value = 'false'
  64.         if isinstance(value, tuple) or isinstance(value, list):
  65.             value = self._list_separator.join(value) + ';'
  66.         ConfigParser.set(self, 'Desktop Entry', option, value)
  67.  
  68.     def write(self, file_object):
  69.         file_object.write('[Desktop Entry]\n')
  70.         items = []
  71.         if not self.filename:
  72.             file_object.write('Encoding=UTF-8\n')
  73.             file_object.write('Type=' + str(self.file_type) + '\n')
  74.         for item in self.items('Desktop Entry'):
  75.             items.append(item)
  76.         items.sort()
  77.         for item in items:
  78.             file_object.write(item[0] + '=' + item[1] + '\n')
  79.  
  80. def getUniqueFileId(name, extension):
  81.     append = 0
  82.     while 1:
  83.         if append == 0:
  84.             filename = name + extension
  85.         else:
  86.             filename = name + '-' + str(append) + extension
  87.         if extension == '.desktop':
  88.             path = getUserItemPath()
  89.             if not os.path.isfile(os.path.join(path, filename)) and not getItemPath(filename):
  90.                 break
  91.         elif extension == '.directory':
  92.             path = getUserDirectoryPath()
  93.             if not os.path.isfile(os.path.join(path, filename)) and not getDirectoryPath(filename):
  94.                 break
  95.         append += 1
  96.     return filename
  97.  
  98. def getUniqueRedoFile(filepath):
  99.     append = 0
  100.     while 1:
  101.         new_filepath = filepath + '.redo-' + str(append)
  102.         if not os.path.isfile(new_filepath):
  103.             break
  104.         else:
  105.             append += 1
  106.     return new_filepath
  107.  
  108. def getUniqueUndoFile(filepath):
  109.     filename, extension = os.path.split(filepath)[1].rsplit('.', 1)
  110.     append = 0
  111.     while 1:
  112.         if extension == 'desktop':
  113.             path = getUserItemPath()
  114.         elif extension == 'directory':
  115.             path = getUserDirectoryPath()
  116.         elif extension == 'menu':
  117.             path = getUserMenuPath()
  118.         new_filepath = os.path.join(path, filename + '.' + extension + '.undo-' + str(append))
  119.         if not os.path.isfile(new_filepath):
  120.             break
  121.         else:
  122.             append += 1
  123.     return new_filepath
  124.  
  125. def getUserMenuPath():
  126.     menu_dir = None
  127.     if os.environ.has_key('XDG_CONFIG_HOME'):
  128.         menu_dir = os.path.join(os.environ['XDG_CONFIG_HOME'], 'menus')
  129.     else:
  130.         menu_dir = os.path.join(os.environ['HOME'], '.config', 'menus')
  131.     #move .config out of the way if it's not a dir, it shouldn't be there
  132.     if os.path.isfile(os.path.split(menu_dir)[0]):
  133.         os.rename(os.path.split(menu_dir)[0], os.path.split(menu_dir)[0] + '.old')
  134.     if not os.path.isdir(menu_dir):
  135.         os.makedirs(menu_dir)
  136.     return menu_dir
  137.  
  138. def getItemPath(file_id):
  139.     if os.environ.has_key('XDG_DATA_DIRS'):
  140.         for system_path in os.environ['XDG_DATA_DIRS'].split(':'):
  141.             file_path = os.path.join(system_path, 'applications', file_id)
  142.             if os.path.isfile(file_path):
  143.                 return file_path
  144.     file_path = os.path.join('/', 'usr', 'share', 'applications', file_id)
  145.     if os.path.isfile(file_path):
  146.         return file_path
  147.     return False
  148.  
  149. def getUserItemPath():
  150.     item_dir = None
  151.     if os.environ.has_key('XDG_DATA_HOME'):
  152.         item_dir = os.path.join(os.environ['XDG_DATA_HOME'], 'applications')
  153.     else:
  154.         item_dir = os.path.join(os.environ['HOME'], '.local', 'share', 'applications')
  155.     if not os.path.isdir(item_dir):
  156.         os.makedirs(item_dir)
  157.     return item_dir
  158.  
  159. def getDirectoryPath(file_id):
  160.     home = getUserDirectoryPath()
  161.     file_path = os.path.join(home, file_id)
  162.     if os.path.isfile(file_path):
  163.         return file_path
  164.     if os.environ.has_key('XDG_DATA_DIRS'):
  165.         for system_path in os.environ['XDG_DATA_DIRS'].split(':'):
  166.             file_path = os.path.join(system_path, 'desktop-directories', file_id)
  167.             if os.path.isfile(file_path):
  168.                 return file_path
  169.     file_path = os.path.join('/', 'usr', 'share', 'desktop-directories', file_id)
  170.     if os.path.isfile(file_path):
  171.         return file_path
  172.     return False
  173.  
  174. def getUserDirectoryPath():
  175.     menu_dir = None
  176.     if os.environ.has_key('XDG_DATA_HOME'):
  177.         menu_dir = os.path.join(os.environ['XDG_DATA_HOME'], 'desktop-directories')
  178.     else:
  179.         menu_dir = os.path.join(os.environ['HOME'], '.local', 'share', 'desktop-directories')
  180.     if not os.path.isdir(menu_dir):
  181.         os.makedirs(menu_dir)
  182.     return menu_dir
  183.  
  184. def getSystemMenuPath(file_name):
  185.     if os.environ.has_key('XDG_CONFIG_DIRS'):
  186.         for system_path in os.environ['XDG_CONFIG_DIRS'].split(':'):
  187.             file_path = os.path.join(system_path, 'menus', file_name)
  188.             if os.path.isfile(file_path):
  189.                 return file_path
  190.     file_path = os.path.join('/', 'etc', 'xdg', 'menus', file_name)
  191.     if os.path.isfile(file_path):
  192.         return file_path
  193.     return False
  194.  
  195. def getUserMenuXml(tree):
  196.     system_file = getSystemMenuPath(tree.get_menu_file())
  197.     name = tree.root.get_menu_id()
  198.     menu_xml = "<!DOCTYPE Menu PUBLIC '-//freedesktop//DTD Menu 1.0//EN' 'http://standards.freedesktop.org/menu-spec/menu-1.0.dtd'>\n"
  199.     menu_xml += "<Menu>\n  <Name>" + name + "</Name>\n  "
  200.     menu_xml += "<MergeFile type=\"parent\">" + system_file +    "</MergeFile>\n</Menu>\n"
  201.     return menu_xml
  202.  
  203. def getIcon(item, for_properties=False):
  204.     pixbuf, path = None, None
  205.     if item == None:
  206.         if for_properties:
  207.             return None, None
  208.         return None
  209.     if isinstance(item, str):
  210.         iconName = item
  211.     else:
  212.         iconName = item.get_icon()
  213.     if iconName and not '/' in iconName and iconName[-3:] in ('png', 'svg', 'xpm'):
  214.         iconName = iconName[:-4]
  215.     icon_theme = gtk.icon_theme_get_default()
  216.     try:
  217.         pixbuf = icon_theme.load_icon(iconName, 24, 0)
  218.         path = icon_theme.lookup_icon(iconName, 24, 0).get_filename()
  219.     except:
  220.         if iconName and '/' in iconName:
  221.             try:
  222.                 pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(iconName, 24, 24)
  223.                 path = iconName
  224.             except:
  225.                 pass
  226.         if pixbuf == None:
  227.             if for_properties:
  228.                 return None, None
  229.             if item.get_type() == gmenu.TYPE_DIRECTORY:
  230.                 iconName = 'gnome-fs-directory'
  231.             elif item.get_type() == gmenu.TYPE_ENTRY:
  232.                 iconName = 'application-default-icon'
  233.             try:
  234.                 pixbuf = icon_theme.load_icon(iconName, 24, 0)
  235.                 path = icon_theme.lookup_icon(iconName, 24, 0).get_filename()
  236.             except:
  237.                 return None
  238.     if pixbuf == None:
  239.         return None
  240.     if pixbuf.get_width() != 24 or pixbuf.get_height() != 24:
  241.         pixbuf = pixbuf.scale_simple(24, 24, gtk.gdk.INTERP_HYPER)
  242.     if for_properties:
  243.         return pixbuf, path
  244.     return pixbuf
  245.